#pragma once

#include "timer_action.h"

#define MAX_TIMERS 10 // 最大定时器数量

#pragma pack(1)

// 动作结果定义
typedef enum
{
    ACTION_RESULT_FAIL = 0,
    ACTION_RESULT_SUCCESS = 1
} timer_action_result_t;

// 定时器任务配置结构
typedef struct
{
    char name[32];  // 任务名称
    uint8_t param;  // 回调参数
    uint8_t handle; // 句柄
} timer_action_t;

// 星期几的位掩码定义
typedef enum
{
    SUNDAY = 0x01,    // 周日
    MONDAY = 0x02,    // 周一
    TUESDAY = 0x04,   // 周二
    WEDNESDAY = 0x08, // 周三
    THURSDAY = 0x10,  // 周四
    FRIDAY = 0x20,    // 周五
    SATURDAY = 0x40,  // 周六
    EVERYDAY = 0x7F,  // 每天
    WEEKDAYS = 0x3E,  // 周一到周五
    WEEKEND = 0x41    // 周六和周日
} weekday_mask_t;

// 定时器类型
typedef enum
{
    TIMER_ONCE = 0, // 一次
    TIMER_DAILY,    // 每天
    TIMER_WEEKLY    // 每周特定几天
} timer_type_t;

// 定时器时间
typedef struct
{
    uint8_t hour;   // 小时
    uint8_t minute; // 分钟
} timer_time_t;

// 定时器时间类型
typedef enum
{
    TIMER_HOUR_MINUTE = 0, // 小时 & 分钟
    TIMER_SUNRISE_SUNET,   // 日出日落
} timer_time_type_t;

// 定时器配置结构
typedef struct
{
    char name[64];               /* 定时器名称 */
    uint8_t enabled : 1;         // 是否启用
    uint8_t weekdays : 7;        // 星期几的位掩码(仅对TIMER_WEEKLY有效)
    uint8_t type : 4;            // 定时器类型: timer_type_t
    uint8_t time_type : 4;       // 定时器时间类型: timer_time_type_t
    timer_time_t start;          // 开始时间
    timer_time_t end;            // 结束时间
    timer_action_t start_action; // 开始时间到达时的动作
    timer_action_t end_action;   // 结束时间到达时的动作
} timer_task_t;

#define timer_task_config(name, type, time_type, weekdays) \
    {                                                      \
        .name = name,                                      \
        .enabled = 1,                                      \
        .type = type,                                      \
        .time_type = time_type,                            \
        .weekdays = weekdays,                              \
    }
#pragma pack()
bool timer_save();
bool timer_load();

void timer_remove_all(void);
uint8_t timer_get_len(void);
void timer_status_clean(uint8_t idx);
timer_task_t *timer_get(uint8_t idx);
bool timer_add(timer_task_t *config);
bool timer_remove(uint8_t idx);

void timer_loop(void);
void sunrise_sunset_update(void *arg);

uint16_t timer_task_to_json(timer_task_t *timer, char *out, uint16_t size);
uint16_t timers_to_json(char *out, uint16_t size);
uint16_t sunrise_sunset_to_json(char *out, uint16_t size);
